from urllib import request
import re
import time
import random
import csv
from ua_info import ua_list
from fake_useragent import UserAgent
import pymysql

# 定义一个爬虫类


class MaoyanSpider(object):
    # 初始化
    # 定义初始页面url
    def __init__(self):
        self.url = 'https://maoyan.com/board/4?offset={}'
        # 实例化一个对象
        self.ua = UserAgent(path='src/fake_useragent_0.1.11.json')
        # 建立数据库连接对象
        self.db = pymysql.connect(
            host='localhost', user='root', passwd='123456', db='pydb')
        # 创建游标对象
        self.cursor = self.db.cursor()

    # 请求函数
    def get_html(self, url):
        ua_code = self.ua.firefox
        headers = {
            'User-Agent': ua_code
        }
        print("User-Agent: {}".format(ua_code))
        req = request.Request(url=url, headers=headers)
        res = request.urlopen(req)
        html = res.read().decode('utf-8')
        # 直接调用解析函数
        self.parse_html(html)

    # 解析函数
    def parse_html(self, html):
        # 正则表达式
        re_bds = '<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?releasetime">(.*?)</p>'
        # 生成正则表达式对象
        pattern = re.compile(re_bds, re.S)
        # r_list: [('我不是药神','徐峥,周一围,王传君','2018-07-05'),...] 列表元组
        r_list = pattern.findall(html)
        self.save_html(r_list)

    # 保存数据函数，使用内置csv模块
    def save_html(self, r_list):
        L = []
        sql = 'insert into filmtab values(%s,%s,%s)'
        # 整理数据
        for r in r_list:
            t = (
                r[0].strip(),
                r[1].strip()[3:],
                r[2].strip()[5:15]
            )
            L.append(t)
            print(L)
        # 一次性插入多条数据 L:[(),(),()]
        try:
            self.cursor.executemany(sql, L)
            # 将数据提交到数据库
            self.db.commit()
        except:
            # 发生错误则回滚
            self.db.rollback()
    # 主函数

    def run(self):
        # 抓取第一页数据
        for offset in range(0, 11, 10):
            url = self.url.format(offset)
            self.get_html(url)
            # 生成1-2之间的浮点数
            time.sleep(random.uniform(1, 2))
        # 断开游标与数据库连接
        self.cursor.close()
        self.db.close()


# 以脚本方式启动
if __name__ == '__main__':
    start = time.time()
    spider = MaoyanSpider()
    spider.run()
    end = time.time()
    print("执行时间：%.2f" % (end-start))
